import json
import requests


def request_metrics(url):
    try:
        response = requests.get(url)
        response.raise_for_status()  # 检查请求是否成功
        return response.text  # 返回响应的文本内容
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return None


def find_target_value(data, metric_value, extra_key=None, extra_value=None):
    """
    遍历JSON数据，查找匹配的指标值。

    Args:
        data: 要搜索的JSON数据（字典或列表）
        metric_value: 要匹配的metric值
        extra_key: 额外的标签键（如'type', 'task'等），可选
        extra_value: 额外的标签值，可选。如果extra_key不为None，则此项也必须提供

    Returns:
        找到的value值，如果没找到则返回None
    """
    # 如果data是列表，则遍历列表中的每一项
    if isinstance(data, list):
        for item in data:
            result = find_target_value(item, metric_value, extra_key, extra_value)
            if result is not None:
                return result

    # 如果data是字典
    elif isinstance(data, dict):
        # 检查当前字典是否包含'tags'键，并且'tags'也是一个字典
        if 'tags' in data and isinstance(data['tags'], dict):
            tags = data['tags']

            # 首先检查metric是否匹配
            if tags.get('metric') == metric_value:
                # 如果没有提供extra_key，只需要metric匹配即可
                if extra_key is None:
                    return data.get('value')
                # 如果提供了extra_key，需要同时检查extra_key和extra_value
                elif tags.get(extra_key) == extra_value:
                    return data.get('value')

        # 如果当前字典不满足条件，则遍历它的所有值，继续递归查找
        for value in data.values():
            if isinstance(value, (dict, list)):
                result = find_target_value(value, metric_value, extra_key, extra_value)
                if result is not None:
                    return result

    # 如果data既不是列表也不是字典，或者遍历后没找到，返回None
    return None


def fe_info(url):
    fe_url = url
    fe_metrics_text = request_metrics(fe_url)
    if fe_metrics_text is None:
        print("获取指标数据失败")
        return
    try:
        fe_metrics_json = json.loads(fe_metrics_text)

        # 1. 有type键的指标查询示例
        jvm_heap_size_bytes_max = find_target_value(fe_metrics_json, 'jvm_heap_size_bytes', 'type', 'max')
        jvm_heap_size_bytes_used = find_target_value(fe_metrics_json, 'jvm_heap_size_bytes', 'type', 'used')
        jvm_thread_count = find_target_value(fe_metrics_json, 'jvm_thread', 'type', 'count')
        # 2. 有其他键（如task）的指标查询示例
        doris_fe_agent_task_update = find_target_value(fe_metrics_json, 'doris_fe_agent_task_total', 'task',
                                                       'UPDATE_VISIBLE_VERSION')
        # 3. 没有额外键的指标查询示例
        doris_fe_request_total = find_target_value(fe_metrics_json, 'doris_fe_request_total')

        res_list.append({"jvm_heap_size_bytes_max": jvm_heap_size_bytes_max})
        res_list.append({"jvm_heap_size_bytes_used": jvm_heap_size_bytes_used})
        res_list.append({"jvm_thread_count": jvm_thread_count})
        res_list.append({"doris_fe_agent_task_update": doris_fe_agent_task_update})
        res_list.append({"doris_fe_request_total": doris_fe_request_total})

        print(res_list)

    except json.JSONDecodeError as e:
        print(f"解析返回的JSON数据失败: {e}")
    except Exception as e:
        print(f"处理数据时发生未知错误: {e}")


if __name__ == '__main__':
    fe_url = "http://172.16.100.204:8030/metrics?type=json"
    res_list = []
    fe_info(fe_url)
